package com.huilian.tool.douyin.web.service;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 少凡
 * date 2022/5/27 11:58
 * version 1.0
 */
public interface DouYinService {

    /**
     * 拼接获取抖音授权码请求URL
     *
     * @param redirectUri
     * @param state
     * @return
     */
    String getOauthCode(String redirectUri, String state);

    /**
     * 为用户授权第三方接口调用的凭证，存储在客户端，可能会被窃取，泄漏后可能会发生用户隐私数据泄漏的风险，建议存储在服务端。
     *
     * @param code
     * @return
     */
    JSONObject getAccessToken(String code);


    /**
     * 通过旧的refresh_token获取新的refresh_token，调用后旧refresh_token会失效，
     * 新refresh_token有30天有效期。最多只能获取5次新的refresh_token，5次过后需要用户重新授权。
     *
     * @param refreshToken
     * @return
     */
    JSONObject refreshToken(String refreshToken);


    /**
     * 刷新access_token或续期不会改变refresh_token的有效期；如果需要刷新refresh_token有效期可以调用/oauth/renew_refresh_token/接口
     * 当access_token过期（过期时间15天）后，可以通过该接口使用refresh_token（过期时间30天）进行刷新：
     *
     * @param refreshToken
     * @return
     */
    JSONObject refreshAccessToken(String refreshToken);


    String getSilenceCode(String redirectUri, String state);


    /**
     * 该接口获取用户的抖音公开信息，包含昵称、头像、性别和地区；适用于抖音
     * Scope: user_info 需要用户授权
     *
     * @param openId
     * @param accessToken
     * @return
     */
    JSONObject getUserInfo(String openId, String accessToken);


    /**
     * 获取用户最近的粉丝列表，不保证顺序；目前可查询的粉丝数上限5千。该接口适用于抖音
     * Scope: fans.list 需要用户授权
     *
     * @param openId
     * @param accessToken
     * @param count
     * @param cursor
     * @return
     */
    JSONObject getFansList(String openId, String accessToken, Integer count, Integer cursor);

    /**
     * Scope: following.list 需要用户授权
     * 获取用户的关注列表；该接口适用于抖音。
     *
     * @param openId
     * @param count
     * @param cursor
     * @return
     */
    JSONObject getFollowingList(String openId, String accessToken, Integer count, Integer cursor);

    /**
     * 粉丝判断，判断followerOpenId,是否关注了openId
     *
     * @param followerOpenId
     * @param openId
     * @return
     */
    JSONObject fansCheck(String followerOpenId, String openId, String accessToken);


    /**
     * Scope：'video.list' 需要用户授权 需要申请权限
     * 该接口用于分页获取用户所有视频的数据，返回的数据是实时的。该接口适用于抖音。
     *
     * @param openId
     * @param accessToken
     * @param count
     * @param cursor
     * @return
     */
    JSONObject getVideoList(String openId, String accessToken, Integer count, Integer cursor);


    /**
     * * Scope: video.data 需要用户授权 需要申请权限
     * 该接口 用于查询用户特定视频的数据, 如点赞数, 播放数等，返回的数据是实时的。该接口适用于抖音。
     *
     * @param openId
     * @param accessToken
     * @param itemIds
     * @return
     */
    JSONObject getVideoData(String openId, String accessToken, String[] itemIds);


    /**
     * 评论列表
     * Scope: item.comment 需要申请权限
     * 需要用户授权 该接口用于获取评论列表。
     *
     * @param openId
     * @param accessToken
     * @param count
     * @param cursor
     * @return
     */
    JSONObject getCommentList(String openId, String accessToken, String itemId, Integer count, Integer cursor);

    /**
     * 评论回复列表
     * Scope: item.comment 需要申请权限 需要用户授权
     * 该接口用于获取评论回复列表。
     *
     * @param openId
     * @param accessToken
     * @param itemId
     * @param commentId
     * @param count
     * @param cursor
     * @return
     */
    JSONObject getCommentReplyList(String openId, String accessToken, String itemId, String commentId, Integer count, Integer cursor);

    /**
     * 回复视频评论
     * Scope: item.comment 需要申请权限 需要用户授权
     * 该接口用于回复视频评论。只能回复授权用户自己发布的视频。
     *
     * @param openId
     * @param accessToken
     * @param itemId
     * @param commentId
     * @param content
     * @return
     */
    JSONObject commentReply(String openId, String accessToken, String itemId, String content, String commentId);

    /**
     * 直接对视频进行评论
     * Scope: item.comment 需要申请权限 需要用户授权
     * 该接口用于回复视频评论。只能回复授权用户自己发布的视频。
     *
     * @param openId
     * @param accessToken
     * @param itemId
     * @param content
     * @return
     */
    JSONObject commentReply(String openId, String accessToken, String itemId, String content);


    JSONObject getShopPoiQuery(String accessToken, Integer page, Integer size);

    /**
     * 抖音回调
     */
    String receiveDouYinNotice(HttpServletRequest request);


}
